#include <iostream>

// 继承方式
// 1. 公共继承 ： 父类的公有成员和保护成员在子类中保持不变
// 2. 保护继承 ： 父类的公有成员和保护成员在子类中都变成保护成员
// 3. 私有继承 ： 父类的公有成员和保护成员在子类中都变成私有成员
// 都无法访问父类的私有成员

class Base1
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};

class Son1 : public Base1
{
public:
    void func()
    {
        m_A = 10;   // 公共继承可以访问父类的公有成员
        m_B = 20;   // 公共继承可以访问父类的保护成员,但是不能在类外访问
        // m_C = 30;  // 公共继承不能访问父类的私有成员
    }
};

void test01()
{
    Son1 s1;
    s1.m_A = 100;
}

class Base2
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};

class Son2 : protected Base2
{
public:
    void func()
    {
        m_A = 10;   // 保护继承可以访问父类的公有成员
        m_B = 20;   // 保护继承可以访问父类的保护成员
        // m_C = 30;  // 保护继承不能访问父类的私有成员
    }
};

void test02()
{
    Son2 s2;
    // s2.m_A = 100;
    // s2.m_B = 200;
}

class Base3
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};

class Son3 : private Base3
{
public:
    void func()
    {
        m_A = 10;   // 私有继承可以访问父类的公有成员
        m_B = 20;   // 私有继承可以访问父类的保护成员
        // m_C = 30;  // 私有继承不能访问父类的私有成员
    }
};

void test03()
{
    Son3 s3;
    // s3.m_A = 100;
    // s3.m_B = 200;
}



int main()
{

    return 0;
}